<?php

namespace Api\Pay;

use Core\Env;
use S\Http;
use S\Security\Api;

/**
 * Class Base
 * @package Api\Pay
 * @description 支付平台sdk基础服务类
 */
class Base {

    const URL_PRD_PUBLIC = "https://www.fenqilianmeng.com/pay/api/";  //生产地址-公网
    const URL_PRD_INNET = "http://pay.i.fenqilianmeng.com/api/";  //生产地址-内网
    const URL_DEV = "http://pay.i.hrbbwx.com/api/";  //测试地址

    const REQUEST_METHOD = "POST";  //访问方式
    const TIMEOUT = 2000;  //超时时间
    const SUCCESS_CODE = "2000000";  //请求成功响应码

    const ERR_CODE_TIMEOUT = "3070000";  //响应超时错误码
    const ERR_MSG_TIMEOUT = "支付平台响应超时";  //响应超时错误信息
    const ERR_CODE_MALFORMAT_RESPONSE = "3070001";  //响应报文格式异常错误码
    const ERR_MSG_MALFORMAT_RESPONSE = "支付平台响应报文异常";  //响应报文格式异常错误信息

    const TRANS_TYPE_WITHDRAW = 1;
    const TRANS_TYPE_DEDUCE = 2;
    const TRANS_TYPE_PAY = 3;
    /**
     * @var string 错误码
     */
    protected $_err_code;
    /**
     * @var string 错误信息
     */
    protected $_err_msg;

    /**
     * 发起请求
     *
     * @param string $appkey 应用appkey
     * @param string $uri 服务uri
     * @param array $params default array() 请求参数
     * @param int $timeout default 2000 超时时间, 默认2s
     *
     * @return array
     * @throws \S\Exception
     */
    protected function request($appkey, $uri, array $params = array(), $timeout = self::TIMEOUT) {
        /**
         * 环境判断
         * 1.是否生产
         * 2.是否和支付平台处于一个网络
         */
        if (!Env::isProductEnv()) {
            $url = self::URL_DEV;
        } else if (Env::isLocalNet()) {
            $url = self::URL_PRD_INNET;
        } else {
            $url = self::URL_PRD_PUBLIC;
        }

        $params = Api::getSign($appkey, $params);

        $resp_json = Http::request($url . $uri, self::REQUEST_METHOD, $params, $timeout);
        /**
         * 响应超时
         */
        if (empty($resp_json)) {
            $this->_err_code = self::ERR_CODE_TIMEOUT;
            $this->_err_msg = self::ERR_MSG_TIMEOUT;

            return false;
        }
        /**
         * 响应报文异常
         */
        $resp_data = json_decode($resp_json, true);
        if (false === $resp_data || is_null($resp_data)) {
            $this->_err_code = self::ERR_CODE_MALFORMAT_RESPONSE;
            $this->_err_msg = self::ERR_MSG_MALFORMAT_RESPONSE;

            return false;
        }
        /**
         * 服务异常
         */
        $this->_err_code = $resp_data["retcode"];
        $this->_err_msg = $resp_data["msg"];

        if (self::SUCCESS_CODE != $this->_err_code) {
            return false;
        }

        return $resp_data["data"];
    }

    /**
     * 获取错误码
     *
     * @return string
     */
    public function getErrCode() {
        return $this->_err_code;
    }

    /**
     * 获取错误信息
     *
     * @return string
     */
    public function getErrMsg() {
        return $this->_err_msg;
    }

} 